package edu.ustb.aur.utils;

import java.math.BigDecimal;
import java.util.HashMap;

/**
 * @author ShiZhe
 * @create 2021-10-29 15:37 工具类 作用是集成计算percentage相关的方法
 */
public class PercentageOperate {

    /**
     * 默认除法运算精度
     */
    private static final int DEF_DIV_SCALE = 10;

    /**
     * rightMap百分比求和
     *
     * @param rightMap
     *            人与权占比对应map
     * @return 求和结果
     */
    public static Double total(HashMap<String, Double> rightMap) {
        double total = 0.0;
        for (double value : rightMap.values()) {
            BigDecimal bigDecimal1 = BigDecimal.valueOf(total);
            BigDecimal bigDecimal2 = BigDecimal.valueOf(value);
            total = bigDecimal1.add(bigDecimal2).doubleValue();
        }
        return total;
    }

    /**
     * 相等判断
     *
     * @param double1
     *            第一个数
     * @param double2
     *            第二个数
     * @return true(相等) or false(不相等)
     */
    public static boolean equal(double double1, double double2) {
        return Double.doubleToLongBits(double1) == Double.doubleToLongBits(double2);
    }

    /**
     * 不等判断
     *
     * @param double1
     *            第一个数
     * @param double2
     *            第二个数
     * @return true(不相等) or false(相等)
     */
    public static boolean notEqual(double double1, double double2) {
        return Double.doubleToLongBits(double1) != Double.doubleToLongBits(double2);
    }

    /**
     * 比较判断
     *
     * @param double1
     *            第一个数
     * @param double2
     *            第二个数
     * @return 如果v1 大于v2 则 返回true 否则false
     */
    public static boolean compare(double double1, double double2) {
        BigDecimal b1 = BigDecimal.valueOf(double1);
        BigDecimal b2 = BigDecimal.valueOf(double2);
        int bj = b1.compareTo(b2);
        boolean res;
        res = bj > 0;
        return res;
    }

    /**
     * 相加操作
     *
     * @param double1
     *            第一个数
     * @param double2
     *            第二个数
     * @return 返回结果
     */
    public static Double add(double double1, double double2) {
        BigDecimal bigDecimal1 = BigDecimal.valueOf(double1);
        BigDecimal bigDecimal2 = BigDecimal.valueOf(double2);
        return bigDecimal1.add(bigDecimal2).doubleValue();
    }

    /**
     * 相减操作
     *
     * @param double1
     *            第一个数
     * @param double2
     *            第二个数
     * @return 返回结果
     */
    public static Double subtract(double double1, double double2) {
        BigDecimal bigDecimal1 = BigDecimal.valueOf(double1);
        BigDecimal bigDecimal2 = BigDecimal.valueOf(double2);
        return bigDecimal1.subtract(bigDecimal2).doubleValue();
    }

    /**
     * 乘法运算
     *
     * @param double1
     *            被乘数
     * @param double2
     *            乘数
     * @return 两个参数的积
     */
    public static double mul(double double1, double double2) {
        BigDecimal b1 = BigDecimal.valueOf(double1);
        BigDecimal b2 = BigDecimal.valueOf(double2);
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供（相对）精确的除法运算，当发生除不尽的情况时，精确到小数点以后10位，以后的数字四舍五入
     *
     * @param double1
     *            被除数
     * @param double2
     *            除数
     * @return 两个参数的商
     */

    public static double div(double double1, double double2) {
        return div(double1, double2, DEF_DIV_SCALE);
    }

    /**
     * 提供（相对）精确的除法运算。当发生除不尽的情况时，由scale参数指定精度，以后的数字四舍五入
     *
     * @param double1
     *            被除数
     * @param double2
     *            除数
     * @param scale
     *            表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double double1, double double2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b1 = BigDecimal.valueOf(double1);
        BigDecimal b2 = BigDecimal.valueOf(double2);
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理
     *
     * @param double1
     *            需要四舍五入的数字s
     * @param scale
     *            小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double double1, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException("The scale must be a positive integer or zero");
        }
        BigDecimal b = BigDecimal.valueOf(double1);
        return b.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

}
